package com.zmn.plat.services.interfaces.category;

import java.util.List;

import com.zmn.common.dto.VtDTO;
import com.zmn.plat.model.entity.category.BaseCategory;
import com.zmn.plat.model.entity.category.BaseCategoryQuery;
import com.zmn.plat.model.entity.category.CategoryInfoDTO;

/**
 * @author duanzuocai
 * @version v1.0
 * @类说明：产品分类管理
 * @since 2018/10/19 9:22
 */
public interface BaseCategoryService {

    /**
     * ID 查询
     *
     * @param categoryId
     *            分类ID
     * @return
     */
    BaseCategory findByKey(Integer categoryId);

    /**
     * ID 查询
     *
     * @param categoryId
     *            分类ID
     * @return
     */
    BaseCategory findByKeyOfCache(Integer categoryId);

    /**
     * ID 查询 不走缓存
     *
     * @param categoryId
     * @return
     * @see BaseCategoryService#findByKey(java.lang.Integer)
     */
    @Deprecated
    BaseCategory findByKeyNoCache(Integer categoryId);

    /**
     * ID 查询
     *
     * @param categoryId
     * @return
     */
    List<BaseCategory> findByKeys(List<Integer> categoryId);

    /**
     * 名称查询
     *
     * @param name
     *            名称
     * @return
     */
    BaseCategory findByName(String name);

    /**
     * 通过前台二级分类id获取前台产品二级分类
     *
     * @param categId
     *            后台二级分类id
     * @return
     */
    BaseCategory findShowCategoryByCategId(Integer categId);

    /**
     * 分页搜索
     *
     * @param query
     *            条件
     * @return
     */
    List<BaseCategory> listPageByQuery(BaseCategoryQuery query);

    /**
     * 分页搜索:计价器专用
     *
     * @param query
     *            条件
     * @return
     */
    List<BaseCategory> listPageByFaultQuery(BaseCategoryQuery query);

    /**
     * 查询子分类
     *
     * @param parentId
     *            父ID
     * @return
     */
    List<VtDTO> listByParentId(Integer parentId);

    /**
     * 查询子分类
     *
     * @param parentId
     *            父ID
     * @param statusEnable
     *            状态
     * @return
     */
    List<BaseCategory> listByParentId(int parentId, int statusEnable);

    /**
     * 查询前台子分类
     *
     * @param parentId
     *            父ID
     * @param statusEnable
     *            状态
     * @return
     * @auther: linfeng
     * @since: 2019/9/21 16:41
     */
    List<BaseCategory> listByParentIdForShow(int parentId, int statusEnable);

    /**
     * 搜索
     *
     * @param query
     *            条件
     * @return
     */
    List<BaseCategory> listByQuery(BaseCategoryQuery query);

    /**
     * 描述: 查询所有的产品分类
     *
     * @return java.util.List<com.zmn.plat.model.entity.category.BaseCategory>
     * @author jiafei
     * @since 2021/6/29 10:16
     */
    List<BaseCategory> listAll();

    /**
     * 获取前台产品对应的后台产品的二级分类
     *
     * @Param:productFaultItemQuery
     * @return: List<ProductTariffGroupItemVo>
     * @Author: tanbiao
     * @since: 2019/11/21 17:28
     */
    // List<ProductTariffGroupItemVo> listCategoryByShowProductId(ProductTariffGroupItemQuery productFaultItemQuery);

    /**
     * 根据showType level查询当前最大排序号
     *
     * @param showType
     * @param level
     * @return
     */
    Integer findMaxSort(Integer showType, Integer level);

    /**
     * 搜索统计
     *
     * @param query
     *            条件
     * @return
     */
    Integer countByQuery(BaseCategoryQuery query);

    /**
     * 搜索统计:计价器专用
     *
     * @param query
     *            条件
     * @return
     */
    Integer countByFaultQuery(BaseCategoryQuery query);

    /**
     * 根据渠道ID和服务分类ID查询一级产品分类
     *
     * @param channelId
     *            the channel id
     * @param showType
     *            产品分类 1后台 2前台
     * @param servCategId
     *            the serv categ id
     * @return
     */
    List<BaseCategory> listOneCategoryByChannelIdAndServCategId(Integer channelId, Integer showType, Integer servCategId);

    /**
     * 根据渠道ID和产品一级分类ID查询二级产品分类
     *
     * @param channelId
     *            the channel id
     * @param showType
     *            产品分类 1后台 2前台
     * @param categOneId
     *            the categ one id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndCategOneId(Integer channelId, Integer showType, Integer categOneId);

    /**
     * 获取渠道开通的二级分类列表
     *
     * @param channelId
     *            the channel id
     * @param showType
     *            产品分类 1后台 2前台
     * @param servCategId
     *            the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndServCategId(Integer channelId, Integer showType, Integer servCategId);

    List<CategoryInfoDTO> listShowCategByChannelId(Integer channelId);

    /**
     * 通获取渠道城市开通的二级分类列表
     *
     * @param channelId
     *            the channel id
     * @param cityId
     *            the city id
     * @param servCategId
     *            the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndCityIdAndServCategId(Integer channelId, Integer cityId, Integer servCategId);

    /**
     * 根据前台服务品类查询关联的后台服务品类
     * @param unionIds
     * @return
     */
    List<CategoryInfoDTO> listCategoryByShowCategoryUnionIds(String[] unionIds);

    /**
     * 获取渠道开通的二级分类列表(批量服务分类ID)
     *
     * @param channelId
     *            the channel id
     * @param showType
     *            产品分类 1后台 2前台
     * @param servCategIds
     *            the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndServCategIds(Integer channelId, Integer showType, List<Integer> servCategIds);

    /**
     * 获取渠道城市开通的前台二级分类列表(批量服务分类ID)
     *
     * @param channelId
     *            the channel id
     * @param cityId
     *            the city id
     * @param servCategIds
     *            the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndCityIdAndServCategIds(Integer channelId, Integer cityId, List<Integer> servCategIds);

    /**
     * 更新
     *
     * @param category
     *            条件
     * @return
     */
    Integer updateByKey(BaseCategory category);

    /**
     * 更新排序
     *
     * @param categId
     *            分类ID
     * @param sort
     *            排序
     * @param updater
     *            更新人
     * @return
     */
    Integer updateSortKey(int categId, int sort, String updater);

    /**
     * 更新首字母
     *
     * @param categId
     *            分类ID
     * @param firstLetter
     *            首字母
     * @param updater
     *            更新人
     * @return
     */
    Integer updateFirstLetterByKey(int categId, String firstLetter, String updater);

    /**
     * 更新简称
     *
     * @param categId
     *            分类ID
     * @param firstLetter
     *            首字母
     * @param updater
     *            更新人
     * @return
     */
    Integer updateSimpleSpellKey(Integer categId, String firstLetter, String updater);
    /**
     * 批量更新排序
     *
     * @param arrayIds
     *            id's
     * @param status
     *            状态
     * @param mcStaffName
     *            更新人
     * @return
     */
    Integer updateStatusBatch(List<Integer> arrayIds, int status, String mcStaffName);

    /**
     * 批量更新计价器状态
     *
     * @param categoryIds
     *            分类Id
     * @param status
     *            状态
     * @param mcStaffName
     *            更新人
     * @param productType
     *            产品类型
     * @return
     */
    Integer updateTariffStatusBatch(List<Integer> categoryIds, int status, String mcStaffName, Integer productType);

    /**
     * 更新
     *
     * @param category
     *            分类
     * @return
     */
    Integer insert(BaseCategory category);

}
